package chaoyue.study.juc;

import chaoyue.study.ThreadUtils;

import java.util.concurrent.CompletableFuture;

/**
 * CompletableFuture
 * 在使用supplyAsync处理有返回值的任务时，处理使用传统的get获取返回结果，也可以通过whenComplete指定回调函数
 * 在任务处理完成后回自动调用回调用函数，并把任务的执行结果和异常作为参数进行传递
 * exceptionally可以指定异常回调，即任务发生了异常时自动调用给定的方法
 */
public class CompletableFutureTest2 {
    public static void main(String[] args) throws Exception {
        CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("f1 start..." + Thread.currentThread().getName());
            ThreadUtils.sleepRandom();
            //int i = 1/0;
            System.out.println("f1 end..." + Thread.currentThread().getName());
            return "f1 result";
        });

        // 执行完成，触发请求回调 接受一个BiConsumer，r表示返回的结果，e表示抛出的异常
        f1.whenComplete((r, e) -> {
            if (e == null) {
                System.out.println("f1-whenComplete-success " + r);
            } else {
                System.out.println("f1-whenComplete-error " + e);
            }
        });

        // 异常回调，执行异常会触发
        f1.exceptionally(e -> {
            System.out.println("f1-exceptionally-error..." + e);
            return null;
        });

        System.out.println("main end...");
        ThreadUtils.sleep();
    }
}
